home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Programming / AmigaTalk / User / Graph.st < prev    next >
Text File  |  2000-05-07  |  6KB  |  187 lines

  1. " ------------------------------------------------------------- "
  2. " Graph.st - Implementation of graph paper class for drawing    "
  3. "            functions in a window.                             "
  4. " ============================================================= "
  5. " scr    = Screen object.                                       "
  6. " win    = Window object.                                       "
  7. " ts     = Screen title (String object).                        "
  8. " tw     = Window title (String object).                        "
  9. " x      = Left edge of Window.                                 "
  10. " y      = Top  edge of Window.                                 "
  11. " w      = Width  of Window.                                    "
  12. " h      = Height of Window.                                    "
  13. " xscale = multiplier for x-coordinates (derived).              "
  14. " yscale = multiplier for y-coordinates (derived).              "
  15. " xinc   = increment size for x-coordinates.                    "
  16. " yinc   = increment size for y-coordinates.                    "
  17. " range  = Interval for x-coordinates (Xmin to Xmax).           "
  18. " domain = Interval for y-coordinates (Ymin to Ymax).           "
  19. " ------------------------------------------------------------- "
  20.  
  21. Class Graph :Painter
  22. ! scr win ts tw x y w h xscale yscale xinc yinc range domain !
  23. [
  24.   initialize: scrTitle winTitle: title  "First method to use:"
  25.     ts     <- scrTitle.
  26.     tw     <- title.
  27.  
  28.     super new: tw.     "Necessary since we use super Methods."
  29.  
  30.     range  <- Interval new.
  31.     domain <- Interval new.
  32.  
  33.     xinc   <- 0.0.
  34.     yinc   <- 0.0.
  35.  
  36.     xscale <- 1.0.
  37.     yscale <- 1.0
  38. |
  39.   setSizeFrom: orPoint to: brtPoint     "Helper method for open:from:to:"
  40.     scr setOrigin:     orPoint.
  41.     scr setScreenSize: brtPoint.
  42.  
  43.     win setWindowOrigin: orPoint.
  44.     win setWindowSize:   brtPoint.
  45.  
  46.     x <- (orPoint  x).
  47.     y <- (orPoint  y).
  48.     w <- (brtPoint x).
  49.     h <- (brtPoint y).
  50. |
  51.   open: screenMode from: oPoint to: brPoint   "Second method to use:"
  52.     scr <- Screen new.
  53.     win <- Window new.
  54.  
  55.     scr setScreenModeID: screenMode.
  56.     
  57.     self setSizeFrom: oPoint to: brPoint.
  58.     scr  setDepth: 4.
  59.     scr  open
  60.  
  61.     win setFlags:     16r11800.  "RMBTRAP | ACTIVATE | BORDERLESS"
  62.     win openOnScreen: ts
  63. |
  64.   setPen: pen
  65.     super setAPen: pen   "<primitive 200 0 tw pen>"
  66. |
  67.   setXAxisFrom: xmin to: xmax by: deltax
  68.     range from: xmin to: xmax by: deltax.
  69.     xinc   <- deltax.
  70.     xscale <- ((w - x) / (xmax - xmin)).
  71. |
  72.   setYAxisFrom: ymin to: ymax by: deltay
  73.     domain from: ymin to: ymax by: deltay.
  74.     yinc   <- deltay.
  75.     yscale <- ((h - y) / (ymin - ymax))
  76. |
  77.   plotPoint: xpt y: ypt ! p !
  78.     p  <- Point new.
  79.  
  80.     p x: ((w + (xscale * (xpt - (range  last )))) rounded).
  81.     p y: ((h + (yscale * (ypt - (domain first)))) rounded).
  82.  
  83.     super drawPixelAt: p "<primitive 200 11 tw (p x) (p y)>"
  84. |
  85.   drawLine: x1 y1: y1 x2: x2 y2: y2 ! p1 p2 !
  86.     
  87.     p1 <- Point new.
  88.     p2 <- Point new.
  89.  
  90.     p1 x: ((w + (xscale * (x1 - (range  last )))) rounded).
  91.     p1 y: ((h + (yscale * (y1 - (domain first)))) rounded).
  92.     p2 x: ((w + (xscale * (x2 - (range  last )))) rounded).
  93.     p2 y: ((h + (yscale * (y2 - (domain first)))) rounded).
  94.     
  95.     "<primitive 200 6 tw (p1 x) (p1 y) (p2 x) (p2 y)>"
  96.     super drawLineFrom: p1 to: p2 
  97. |
  98.   drawXTick: xp y: yp ! p1 p2 ! "Internal method only."
  99.     p1 <- Point new.
  100.     p2 <- Point new.
  101.  
  102.     p1 x: ((w +     (xscale * (xp - (range  last )))) rounded).
  103.     p1 y: ((h + 3 + (yscale * (yp - (domain first)))) rounded).
  104.     p2 x: ((w +     (xscale * (xp - (range  last )))) rounded).
  105.     p2 y: ((h - 3 + (yscale * (yp - (domain first)))) rounded).
  106.  
  107.     "<primitive 200 6 tw (p1 x) (p1 y) (p2 x) (p2 y)>"
  108.     super drawLineFrom: p1 to: p2 
  109. |
  110.   drawYTick: xp y: yp ! p1 p2 ! "Internal method only."
  111.     p1 <- Point new.
  112.     p2 <- Point new.
  113.  
  114.     p1 x: ((w + 3 + (xscale * (xp - (range  last )))) rounded).
  115.     p1 y: ((h +     (yscale * (yp - (domain first)))) rounded).
  116.     p2 x: ((w - 3 + (xscale * (xp - (range  last )))) rounded).
  117.     p2 y: ((h +     (yscale * (yp - (domain first)))) rounded).
  118.  
  119.     "<primitive 200 6 tw (p1 x) (p1 y) (p2 x) (p2 y)>"
  120.     super drawLineFrom: p1 to: p2 
  121. |
  122.   drawGrid: xticks y: yticks color: pen ! tsize t !
  123.     self setPen: pen.
  124.     tsize <- (range last - range first) / xticks.
  125.      
  126.     (1 to: xticks by: 1)
  127.       do: [:ix | t <- ((ix * tsize) + (range first)). "Draw vert' lines:"
  128.             self drawLine: t y1: domain last x2: t y2: domain first 
  129.           ].
  130.  
  131.     tsize <- (domain last - domain first) / yticks.
  132.     (1 to: yticks by: 1)
  133.       do: [:iy | t <- ((iy * tsize) + (domain first)).
  134.             self drawLine: range first y1: t x2: range last y2: t
  135.           ]
  136. |
  137.   drawXAxis: y0 numTicks: nticks color: pen ! tsize xt !
  138.     (domain inRange: y0)
  139.       ifTrue:  [self setPen: pen.
  140.                 self drawLine: (range first) y1: y0 
  141.                            x2: (range last)  y2: y0.
  142.  
  143.                 (nticks > 0)
  144.                   ifTrue: [tsize <- (range last - range first) / nticks.
  145.                            (1 to: nticks by: 1) 
  146.                             do: [:i | xt <- ((i * tsize) + (range first)).
  147.                                   self drawXTick: xt y: y0
  148.                                 ].
  149.                           ]
  150.                ]
  151.       ifFalse: ['X-Axis outside domain!' print]
  152. |
  153.   drawYAxis: x0 numTicks: nticks color: pen ! tsize yt !
  154.     (range inRange: x0)
  155.       ifTrue:  [self setPen: pen.
  156.                 self drawLine: x0 y1: (domain first)
  157.                            x2: x0 y2: (domain last).
  158.  
  159.                 (nticks > 0)
  160.                   ifTrue: [tsize <- (domain last - domain first) / nticks.
  161.                            (1 to: nticks by: 1) 
  162.                             do: [:i | yt <- ((i * tsize) + (domain first)).
  163.                                   self drawYTick: x0 y: yt
  164.                                 ].
  165.                           ]
  166.                ]
  167.       ifFalse: ['Y-Axis outside range!' print]
  168. |
  169.   drawLabel: labelstr at: aPoint
  170.     "<primitive 200 19 tw labelstr (aPoint x ) (aPoint y)>"
  171.     super drawText: labelstr at: aPoint
  172. |
  173.   tellScales
  174.     ( 'Scales are:  xscale = ', xscale, ', yscale = ', yscale ) print
  175. |
  176.   tellRange
  177.     ( 'Range  is ', range ) print
  178. |
  179.   tellDomain
  180.     ( 'Domain is ', domain ) print
  181. |
  182.   close
  183.     win close.
  184.     scr close.
  185.     ^ nil
  186. ]
  187.